//Promise  并行执行

function ajax (url) {
    return new Promise(function (resolve, reject) {
        //AJAX请求
        var xhr = new XMLHttpRequest()
        //请求方式和地址
        xhr.open('GET', url)
        //请求类型
        //获取结果为json对象而不是字符串
        xhr.responseType = 'json'
        //请求完成过后执行
        xhr.onload = function () {
            if (this.status === 200) {
                //请求成功 返回请求的结果
                resolve(this.response)
            } else {
                //请求失败 返回错误信息 即当前状态文本
                reject(new Error(this.statusText))
            }
        }
        //开始执行异步请求
        xhr.send()
    }) 
}

//Ajax请求之间相互没有依赖 则可以使用并行执行同时请求

//Promise.all()
//对于多个同步任务的执行 可以使用all方法将多个promise合并为一个promise统一管理
//all方法会返回一个全新的promise对象 只有当all内的promise全部完成 其返回的promise才会完成

// var promise = Promise.all([
//     ajax('/api/users.json'),
//     ajax('/api/users.json'),
//     ajax('/api/users.json'),
//     ajax('/api/users.json'),
//     ajax('/api/users.json'),
// ])

//promise完成后会返回一个数组，包含all内每个promise执行的结果
//执行中的promise有一个失败了 执行完毕后其也会因失败而结束
// promise.then(function (values) {
//     console.log(values)
// }).catch(function (error ) {
//     console.log(error);
// })

ajax('/api/urls.json')
    .then(value => {
        console.log(value);
        //将文件内的json对象中可枚举属性值转换成数组
        const urls = Object.values(value)
        //将urls数组内元素逐个执行ajax请求函数并整合成数组
        const tasks = urls.map(url => ajax(url))
        //使用promise并行执行
        return Promise.all(tasks)
    })
    //promise.all并行执行任务的结果
    .then(values => {
        console.log(values);
    })


//Promise.race() 也可以将多个promise对象组合成一个promise对象
//Promise.race() 只会等待第一个结束的任务一起结束
//paromise.all 是等待所有任务结束后才会结束

const request = ajax('/api/posts.json')
const timeout = new Promise((resolve, reject) => {
    //500毫秒过后请求失败
    setTimeout(() => reject(new Error('timeout')), 500)
})

//500毫秒内执行完第一个请求任务可以返回结果  500毫秒过后则未执行完第一个请求任务 返回错误
Promise.race([
    request,
    timeout
])
.then( value => {
    console.log(value);
})
.catch(error => {
    console.log(error);
})